package com.yesep.learn.design.behavioral.state;

/**
 * 状态模式（State Pattern），也称为状态机模式（State Machine Pattern），是设计模式中的一种，属于行为型模式。
 * 其核心思想是允许一个对象在其内部状态改变时改变它的行为，使得对象看起来好像修改了它的类。
 * 这种模式主要用于处理那些其行为依赖于其内部状态的对象，并需要在运行时根据状态改变行为的场景。
 * <p>
 * 一、模式定义与结构
 * 定义：状态模式允许一个对象在其内部状态改变时改变它的行为，对象看起来似乎修改了它的类。
 * <p>
 * 结构：状态模式主要包含三种角色：
 * <p>
 * 环境类角色（Context）：定义客户端需要的接口，内部维护一个当前状态实例，并负责具体状态的切换。
 * 抽象状态角色（State）：定义该状态下的行为，可以有一个或多个行为，这些行为通常是由具体状态类实现的。
 * 具体状态角色（Concrete State）：具体实现该状态对应的行为，并且在需要的情况下进行状态切换。
 * 二、工作原理
 * 状态模式通过将状态相关的行为封装在独立的状态类中，使得对象的行为可以随着内部状态的变化而变化。
 * 当对象的状态发生变化时，它会切换到相应的状态类，并由该状态类来处理与该状态相关的行为。
 * 这样，对象的行为就不再是由它自身直接控制，而是由它的当前状态对象来控制。
 * <p>
 * 三、适用场景
 * 状态模式适用于以下场景：
 * <p>
 * 一个对象的行为取决于它的状态，并且它必须在运行时刻根据状态改变它的行为。
 * 一个操作中含有庞大的多分支结构，并且这些分支决定于对象的状态。
 * 例如，订单处理系统、游戏状态管理、工作流审批系统等都可以使用状态模式来简化代码逻辑，提高系统的可维护性和可扩展性。
 * <p>
 * 四、优点与缺点
 * 优点：
 * <p>
 * 结构清晰：将状态独立为类，消除了冗余的if...else或switch...case语句，使代码更加简洁，提高系统可维护性。
 * 状态转换显示化：使用状态类来表示状态的切换，使得状态的转换更加直观和明确。
 * 易于扩展：新增状态只需增加新的状态类，修改状态转换逻辑也很灵活。
 * 缺点：
 * <p>
 * 类膨胀：如果一个事物具备很多状态，则会造成状态类太多，增加系统的复杂度。
 * 状态转换复杂：状态之间的转换逻辑可能变得复杂，特别是当转换条件较多时，管理这些转换可能成为挑战。
 * 五、示例
 * 以红绿灯为例，红绿灯通常有三个状态：红灯、黄灯和绿灯，每个状态都有其特定的行为和下一个状态。
 * 使用状态模式来模拟红绿灯的状态转换，可以定义一个状态接口（LightState），然后为红灯、黄灯和绿灯分别实现具体的状态类（RedLightState、YellowLightState、GreenLightState）。
 * 最后，定义一个上下文类（LightContext）来管理红绿灯的状态，并提供一个方法来切换状态。
 * <p>
 * 通过这种方式，可以清晰地定义红绿灯的状态和状态转换逻辑，使得代码结构更加清晰和易于维护。
 * 每个状态的行为被封装在独立的状态类中，当红绿灯的状态发生变化时，只需要切换到相应的状态对象，而不需要在上下文类中处理复杂的状态转换逻辑。
 */
public class Main {
    public static void main(String[] args) {
        LightContext lightContext = new LightContext();

        // 切换三次信号灯
        lightContext.toggle(); // Red light is on.
        lightContext.toggle(); // Green light is on.
        lightContext.toggle(); // Yellow light is on.

        lightContext.change(LightState.GREEN);
    }
}
